# Raccolta di algoritmi per predirre il valore di un contesto

require "similarity/similarity"

class Predizione
  # Funzione per la selezione dell'algoritmo a partire da una stringa
  def predici(utenti, utente, soil, alg)
    case alg
    when "norm"
      return self.predict_norm(utenti, utente, soil)
    when "test"
      puts "test riuscito"
    end
  end
  # Algoritmo che usa la media pesata
  def predict_norm(utenti, utente, soil)
    similarity = Similarity.new()
    sim= similarity.similarity(utente, utenti, "cos")
    k=0
    for i in utente.no_context
      predict= 0
      y=0
      div = 0
      for u in utenti
        if sim[y] > soil
          predict= predict + u.context_1[k].to_f*(sim[y])
          div= div + sim[y]
        end
        y= y+1
      end
      predict= predict/div
      if predict.round > 3 then
        utente.predizione[k] = "3"
      else
        utente.predizione[k] = predict.round.to_s
      end
      k= k+1
    end
    return utente.predizione
  end
  # Algoritmo che utilizza la regressione lineare
  def predict_reg (utenti,utente,soil)
    
  end
  # refuso, probabilmente eliminabile
  def predict_base(utenti, soil)
    utenti_simili= []
    sim= []
    for utente in utenti
      s= self.similarity(utente)
      if s > soil
        utenti_simili.push(utente)
        sim.push(s)
      end
    end
    k=0
    for i in self.no_context
      predict= 0
      y=0
      div = 0
      for u in utenti_simili
        predict= predict + u.context_1[k].to_f*(sim[y].to_f)
        div= div + sim[y]
        y= y+1
      end
      predict= predict/div
      if predict.round > 3 then
        self.predizione[k] = "3"
      else
        self.predizione[k] = predict.round.to_s
      end
      k= k+1
    end
    p self.predizione
  end
end
